#pragma once
#include"Common.hpp"
#include<unordered_map>

//这个类负责向堆申请大块内存，并将其管理起来，如果中心缓存空间不足时，pageCache负责将对应的大块内存切分
//然后将切分好的内存块挂在中心缓存对应的span跨度下面
//pageCache还负责将小块内存合并成大块内存，即内存回收机制
//pageCache里面维护了一个spanlist双向链表，与central cache类似，但是与之不同的是，映射方式不同
//central cache映射方式与thread cache相同，但是page cache是按照字节数一一映射的
class PageCache
{
//同样的，为了方便其他的类访问类内成员，我们还是使用单例模式
public:
    static PageCache*GetInstance()
    {
        return &_instance;
    }
    //从pageCache中获取k页的span
    Span*GetPageSpan(size_t k);
    //获取对象与span的映射关系，从而将span返回
    Span*GetObjectToSpan(void*obj);
    //回收central cache交给page cache的空间
    void RecycleCentralCacheMemory(Span*span);
public:
    std::mutex _mutex;
private:
    SpanList _spanlist[MAX_PAGENUM];
    //建立pageid和span的映射关系
    std::unordered_map<PAGE_ID,Span*> _ID_Span_map;

    PageCache(){}
    PageCache(const PageCache&)=delete;
    static PageCache _instance;
};

//对于page cache而言，整个区域都是共享区，我们需要对整个区域加一把锁